package ar.edu.utn.frgp.banco.business.Implements;

import java.util.Date;

import ar.edu.utn.frgp.banco.business.Interfaces.IntExtDep;
import ar.edu.utn.frgp.banco.dao.Implements.ImpCuenta;
import ar.edu.utn.frgp.banco.dao.Implements.ImpMovimientos;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Movimiento;

public class ImpExtDep implements IntExtDep {

	@Override
	public boolean Extraccion(Integer id_cuenta, Double monto) throws Exception {
		// Valido Cuenta Origen (que exista y que el saldo mas el descubierto
		// cubran el monto de la transferencia
		Cuenta cuenta = new Cuenta();
		ImpCuenta cuentadao = new ImpCuenta();
		cuenta = cuentadao.TraerCuenta(id_cuenta);
		try {
			if (cuenta != null) { // La cuenta Origen existe
				Double disponible = (double) 0;

				disponible = cuenta.getDescubierto() + cuenta.getSaldo();

				if (cuenta.getTipoCuenta().equals(cuenta.TIPOCUENTA_CAJAAHORRO)) {
					if (disponible < monto) {
						throw new Exception(
								"El monto a Extraer supera el Saldo Disponible.");
					}
				} else {// Si es Caja de ahorro el monto tiene recargo del 0.6%
						// poreso evalue el disponible con este interes
					if (disponible < (monto * 1.06)) {
						throw new Exception(
								"El monto a Extraer supera el Saldo Disponible.");
					}
				}

				// Genero la Extraccion
				// Nuevo registro en tabla Movimientos (para debito)
				Movimiento movimientodebito = new Movimiento();
				ImpMovimientos movimientosdao = new ImpMovimientos();

				movimientodebito.setFecha(new Date());
				movimientodebito.setId_cuenta(cuenta.getID_Cuenta());
				movimientodebito.setOrigen(movimientodebito.ORIGEN_CAJA);
				Double montototal;

				if (cuenta.getTipoCuenta().equals(cuenta.TIPOCUENTA_CAJAAHORRO)) {
					montototal = monto;

				} else {// si es Cuenta Corriente le sumo el 0.06% de interes
						// por el movimiento
					montototal = monto * 1.06;
				}
				movimientodebito.setMonto(montototal);
				movimientodebito.setSaldoActual(cuenta.getSaldo() - montototal);
				movimientodebito
						.setTipoMov(movimientodebito.TIPOMOVIMIENTO_EXTRACCION);
				movimientosdao.AltaMovimiento(movimientodebito);

				// Modifico el saldo de la cuenta Origen
				cuenta.setSaldo(cuenta.getSaldo() - montototal);
				cuentadao.ModiCuenta(cuenta);

				return true;
			} else {
				throw new Exception("La cuenta es Inexistente.");
			}
		} catch (Exception e) {
			throw new Exception(e.getMessage()); // ENVIO DE ECEPCIONES
		}
	}

	@Override
	public boolean Depositar(Integer id_cuenta, Double monto) throws Exception {
		// Valido Cuenta Origen (que exista y que el saldo mas el descubierto
		// cubran el monto de la transferencia
		Cuenta cuenta = new Cuenta();
		ImpCuenta cuentadao = new ImpCuenta();
		cuenta = cuentadao.TraerCuenta(id_cuenta);
		try {
			if (cuenta != null) { // La cuenta Origen existe
				// Genero el Deposito
				// Nuevo registro en tabla Movimientos (para debito)
				Movimiento movimientodebito = new Movimiento();
				ImpMovimientos movimientosdao = new ImpMovimientos();

				movimientodebito.setFecha(new Date());
				movimientodebito.setId_cuenta(cuenta.getID_Cuenta());
				movimientodebito.setOrigen(movimientodebito.ORIGEN_CAJA);
				Double montototal;

				if (cuenta.getTipoCuenta().equals(cuenta.TIPOCUENTA_CAJAAHORRO)){
					montototal = monto;
				} else {// si es Cuenta Corriente le sumo el 0.06% de interes
						// por el movimiento
					montototal = monto * 0.94;
				}
				
				movimientodebito.setMonto(montototal);
				movimientodebito.setSaldoActual(cuenta.getSaldo() + montototal);
				movimientodebito
						.setTipoMov(movimientodebito.TIPOMOVIMIENTO_DEPOSITO);
				movimientosdao.AltaMovimiento(movimientodebito);

				// Modifico el saldo de la cuenta Origen
				cuenta.setSaldo(cuenta.getSaldo() + montototal);
				cuentadao.ModiCuenta(cuenta);

				return true;
			} else {
				throw new Exception("La cuenta es Inexistente.");
			}
		} catch (Exception e){
			throw new Exception(e.getMessage()); //ENVIO DE ECEPCIONES
		}
	}

}
